package com.sghy.xcxservice.common;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import java.util.*;


@Component
public class JWTUtil {
    private final String secret = "sghyxcx";
    
    
    /**
     * 生成token
     * @param uid 使用的是制图编号
     * @return
     */
    public String generateToken(String uid){
//        String tokenId = UUID.randomUUID().toString();
        long expiration = 86400000;
        return Jwts.builder()
                .setSubject(uid) // 设置主题:通常用于标识令牌的持有者，例如用户ID或用户名。这是一个比较通用的声明，用于表示令牌的主要受众。
//                .setId(drawing_number) // 设置唯一的 Token ID，以防止重放攻击。用来做状态管理及token失效，每次请求校验是否和redis相同
                .setIssuer("sghy")//设置发行人
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expiration))
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }
    
    /**
     * 从token中获取用户名
     * @param token
     * @return
     */
    public String getUserInfoFromToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody();
        return claims.getSubject();
    }
    
    /**
     * 验证token是否还有效
     * @param token
     * @return
     */
    public boolean validateToken(String token) {
        try {
            Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
            String uid = claims.getSubject();
            return claims.getExpiration().after(new Date()) && uid != null && !uid.isEmpty();
        } catch (Exception e) {
            return false;
        }
    }
}
